package dao;

import java.sql.Connection;
import java.util.List;


import models.Login;
import models.Produto;
import models.Tag;
import models.Usuario;

public class FachadaDAO {
	private static FachadaDAO singleton = null;
	
	private java.sql.Connection conexao;
	private ConexaoBanco conexaoBanco;
	
	public static FachadaDAO getInstance() {
        if (singleton == null) {
        // "lazy instantiation"
        singleton = new FachadaDAO();
        }
        return singleton;
    }
	
	private Connection openConexaoBanco(){
		this.conexaoBanco = new ConexaoBanco();		
		this.conexao = this.conexaoBanco.openConexao();
		
		return this.conexao;
	}
	
	private void closeConexaoBanco(){
		this.conexaoBanco.closeConexao();
	}

	public List<Login> listarTodosLogins() {
		
		LoginDAO loginDAO = new LoginDAO(this.openConexaoBanco());
		List<Login>  listaLogins = loginDAO.listarTodos();
		
		this.closeConexaoBanco();
		return listaLogins;
	}

	public boolean cadastrarLogin(Login lo) {
		// TODO Auto-generated method stub
		LoginDAO loginDAO = new LoginDAO(this.openConexaoBanco());
		
		boolean retorno = loginDAO.cadastrar(lo);
		this.closeConexaoBanco();
		return retorno;
	}

	public Login buscarLogin(String username) {
		LoginDAO loginDAO = new LoginDAO(this.openConexaoBanco());
		Login login = loginDAO.buscarLogin(username);
		this.closeConexaoBanco();
		return login;
	}

	public boolean cadastrarTag(Tag tag) {
		TagDAO tagDAO = new TagDAO(this.openConexaoBanco());
		boolean retorno = tagDAO.cadastrar(tag);
		this.closeConexaoBanco();
		return retorno;
	}
	
	public List<Tag> listarTodasTags(){
		TagDAO tagDAO = new TagDAO(this.openConexaoBanco());
		
		List<Tag> listaTags = tagDAO.listarTags();
		this.closeConexaoBanco();
		
		return listaTags;
			
	}

	public boolean cadastrarUsuario(Usuario usuario) {
		UsuarioDAO usuarioDAO = new UsuarioDAO(this.openConexaoBanco());
		
		boolean retorno = usuarioDAO.cadastrar(usuario);
		
		this.closeConexaoBanco();
		return retorno;
		
	}

	public List<Usuario> listarTodosUsuarios() {
		UsuarioDAO usuarioDAO = new UsuarioDAO(this.openConexaoBanco());
		
		List<Usuario> listaUsuarios = usuarioDAO.listarUsuarios();
		this.closeConexaoBanco();
		return listaUsuarios;
	}

	public void excluirUsuario(String _id) {
		
		UsuarioDAO usuarioDAO = new UsuarioDAO(this.openConexaoBanco());
		
		usuarioDAO.excluirUsuario(_id);
		this.closeConexaoBanco();
	}

	public void excluirLogin(String _id) {
		LoginDAO loginDAO = new LoginDAO(this.openConexaoBanco());
		
		loginDAO.excluirLogin(_id);
		this.closeConexaoBanco();
	}

	public boolean cadastrarProduto(Produto produto, String _tagID) {
		// TODO Auto-generated method stub
		ProdutoDAO produtoDAO = new ProdutoDAO(this.openConexaoBanco());
		
		boolean retorno = produtoDAO.cadastrarProduto(produto, _tagID);
		this.closeConexaoBanco();
		return retorno;
	}
	
	public List<Produto> listarProdutosPorNome(String busca) {
		ProdutoDAO produtoDAO = new ProdutoDAO(this.openConexaoBanco());
		
		return produtoDAO.listarProdutosPorNome(busca);
	}

	public List<Produto> listarTodosProdutos() {
		ProdutoDAO produtoDAO = new ProdutoDAO(this.openConexaoBanco());
		
		return produtoDAO.listarTodos();
	}

	public void excluirTag(String _id) {
		TagDAO tagDAO = new TagDAO(this.openConexaoBanco());
		
		tagDAO.excluirTag(_id);
	}

	public Produto buscarProduto(String id) {
		ProdutoDAO produtoDAO = new ProdutoDAO(this.openConexaoBanco());
		
		return produtoDAO.buscarPorID(id);
	}
	
	
}
